package cn.ly.proxy.dynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理
 * 主要作用：无侵入式的 为目标对象 进行增强
 * @param <T>   其持有真实对象的引用
 */
public class StuInvocationHandler<T> implements InvocationHandler{

    //让本类持有：被代理的真实对象。手动加的
    T target;

    //构造函数为T赋值，target不能为空，否则invoke调用中报NullPointerException
    public StuInvocationHandler(T target){
        this.target = target;
    }

    /**
     *
     * @param proxy  真实的代理对象【动态生成】
     * @param method  指代的是我们所要调用真实对象的某个方法的Method对象
     * @param args    指代的是调用真实对象某个方法时接受的参数
     * @return        我们此处返回了该Method对象的调用结果
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println(">>>>>>>>>>进入invoke方法，开始代理执行前置增强："+method.getName() +"方法");
        Object result = method.invoke(target,args);     //执行真实对象target的 原方法
        System.out.println(">>>>>>>>>>执行后置增强");
        return result;
    }

    /**
     * 通过Proxy的静态方法，获取代理实例
     * @return  代理对象实例
     */
    public Object getProxyInstance(){
        return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(),  this);  //this即一个invokeHander实现类，实现了invoke()增强方法
    }
}
